package com.juc.phaser.phaser2;

import java.util.concurrent.Phaser;

public class PrintTools {
    /**
     * 方法arriveAndAwaitAdvance()与CountDownLatch的await()方法大体一样
     * arrive是到达的意思 wait是等待的意思 而advance是前进、促进的意思所以执行这个方法的作用
     * 就是当前线程已经到达屏障，在此等待一段时间，等条件满足后继续向下一个屏障继续运行。
     * 
     * 通过前面的解释可以发现 类 Phaser具有设置多屏障的功能，有类似于体育竞赛中“赛段”的作用，
     * 运动员第一赛段结束后，开始修整准备，然后集体到第二赛段的起跑点，等待比赛开始后，运动员
     * 们又继续比赛了，说明Phaser类和CyclicBarrier类功能上有重叠。
     * 
     * 
     * 从结果来看说明线程C,也就是运动员C,中途退出了比赛，导致后面的比赛不能正常继续，这样的情况是非常糟糕的，
     * 在现实的情况下也不会出现，因为C线程仅仅执行了一次arriveAndAwaitAdvance()导致这样的运行结果，
     * 那可不可以当线程C不想参加下一轮的比赛是，有一个注销比赛的功能呢？
     * 
     * 使用Phaser 可以实现
     * 
     * 
     */
	public static Phaser phaser;
	
	public static void methodA() {
		System.out.println(Thread.currentThread().getName() + " A1 begin= " + System.currentTimeMillis());
		phaser.arriveAndAwaitAdvance();
		System.out.println(Thread.currentThread().getName() + " A1 end= " + System.currentTimeMillis());
		System.out.println(Thread.currentThread().getName() + " A2 begin= " + System.currentTimeMillis());
		phaser.arriveAndAwaitAdvance();
		System.out.println(Thread.currentThread().getName() + " A2 end=  " + System.currentTimeMillis());
	}
	public static void methodB() {
		
		try {
			System.out.println(Thread.currentThread().getName() + " A1 begin= " + System.currentTimeMillis());
			Thread.sleep(5000);
			phaser.arriveAndAwaitAdvance();
			System.out.println(Thread.currentThread().getName() + " A1 end= " + System.currentTimeMillis());
			
		} catch (InterruptedException e) {
		
			e.printStackTrace();
		}
		
	}
}
